제7장. 양자 오류 정정 코드 (QECC)
6장에서 우리는 현실의 큐빗이 \(X\)(비트 플립), \(Z\)(위상 플립), \(Y\)(둘 다)라는 이산적인 오류에 노출된다는 것을 배웠습니다. 만약 이 오류를 수정할 수 없다면, 양자 컴퓨터는 몇 개의 게이트만 거쳐도 결어긋남으로 인해 모든 정보가 무작위적인 잡음으로 변해버릴 것입니다.
하지만 양자 정보는 어떻게 “수정”할 수 있을까요? 고전 컴퓨터는 ’1’을 ’111’로 복제하여 나중에 다수결로 오류를 찾습니다. 하지만 양자역학은 복제 불가능 원칙(No-Cloning Theorem) 때문에 임의의 큐빗 상태 \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle\)를 복제하는 것을 근본적으로 금지합니다.
양자 오류 정정 코드(QECC)는 ‘복제’나 ’직접 측정’(중첩을 붕괴시키는) 없이, 정보를 여러 큐빗에 분산(인코딩)하고, 보조 큐빗(ancilla)을 이용해 오류의 ’증상’만을 알아내는 놀라운 기법입니다.
1. 기본 개념 (Fundamental Concepts)
복제 불가능 원칙 (No-Cloning Theorem): 알려지지 않은 임의의 양자 상태 \(|\psi\rangle\)를 복사하여 \(|\psi\rangle|\psi\rangle\)로 만드는 유니터리 연산자는 존재하지 않습니다. 이는 양자역학의 선형성(linearity)에 위배됩니다.
상세 설명: 만약 복제 연산자 \(U\)가 존재한다면, \(U|\psi_A\rangle|0\rangle = |\psi_A\rangle|\psi_A\rangle\) 이고 \(U|\psi_B\rangle|0\rangle = |\psi_B\rangle|\psi_B\rangle\) 여야 합니다. 선형성에 의해, \(U(\alpha|\psi_A\rangle + \beta|\psi_B\rangle)|0\rangle = \alpha|\psi_A\rangle|\psi_A\rangle + \beta|\psi_B\rangle|\psi_B\rangle\) 입니다. 하지만 우리가 복제하려는 상태는 \((\alpha|\psi_A\rangle + \beta|\psi_B\rangle)\)이므로, 복제 결과는 \((\alpha|\psi_A\rangle + \beta|\psi_B\rangle) \otimes (\alpha|\psi_A\rangle + \beta|\psi_B\rangle)\) 이어야 합니다. 이 두 결과는 \(\alpha\beta\)의 교차항 때문에 명백히 다릅니다.
오류 정정의 3단계:
- 인코딩 (Encoding): 1개의 ‘논리 큐빗’(\(|\psi\rangle_L\)) 정보를 \(n\)개의 ’물리 큐빗’으로 분산시켜 얽습니다.
- 신드롬 측정 (Syndrome Measurement): 원본 데이터는 건드리지 않고, 보조 큐빗(ancilla)을 사용하여 오류가 ‘발생했는지’, ‘어떤 종류인지’, ’어디서 발생했는지’에 대한 정보(신드롬)만 추출합니다.
- 복구 (Recovery): 측정된 신드롬에 해당하는 복구 연산(예: \(X_3\))을 적용하여 오류를 되돌립니다.
신드롬 (Syndrome) - 오류의 증상: 핵심 아이디어는 데이터의 상태(\(\alpha, \beta\))를 묻지 않고 오류 정보만 얻는 것입니다.
- 예: 3-큐빗 코드에서, 우리는 1번 큐빗이 \(|0\rangle\)인지 \(|1\rangle\)인지 묻지 않습니다.
- 대신, “1번 큐빗과 2번 큐빗의 상태가 (오류가 없었어야 할 상태에 비해) 같은가, 다른가?” 만을 묻습니다.
- 이 “같음/다름” 정보가 바로 신드롬이며, 이는 \(\alpha, \beta\)의 중첩을 붕괴시키지 않습니다.
코드 공간 (Code Space): 인코딩된 ’논리적 0’과 ’논리적 1’이 머무는 \(n\)-큐빗 힐베르트 공간의 2차원 부분공간입니다.
- \(|0\rangle_L = \text{인코딩된 0 상태}\)
- \(|1\rangle_L = \text{인코딩된 1 상태}\)
- 일반 논리 상태: \(|\psi\rangle_L = \alpha|0\rangle_L + \beta|1\rangle_L\)
2. 기호 및 핵심 관계식
논리적 상태 (Logical States): \(|\psi\rangle_L = \alpha|0\rangle_L + \beta|1\rangle_L\)
오류 연산자 (Error Operators): “양자역사” 5장의 크라우스 연산자 \(\{K_i\}\) (여기서는 \(X_1, Z_3\) 등)
신드롬 측정 연산자 (Syndrome Operators): 오류를 탐지하는 헤르미트 연산자(관측량) 집합 \(\{M_k\}\)입니다. (예: \(Z_1 Z_2\), \(Z_2 Z_3\))
- 오류 없는 상태의 조건: 코드 공간의 모든 상태 \(|\psi\rangle_L\)는 모든 \(M_k\)의 공통 고유 상태(보통 고유값 +1)여야 합니다. \(M_k |\psi\rangle_L = (+1) |\psi\rangle_L\).
오류 탐지: 만약 오류 \(E\)가 발생하면, \(|\psi'\rangle = E |\psi\rangle_L\)가 됩니다. 이때 \(M_k\)와 \(E\)가 반교환(anti-commute)하면(\(M_k E = -E M_k\)), 신드롬이 바뀝니다. \(M_k |\psi'\rangle = M_k E |\psi\rangle_L = -E M_k |\psi\rangle_L = -E |\psi\rangle_L = -|\psi'\rangle\).
- 측정된 고유값이 \(+1\)에서 \(-1\)로 바뀌었으므로, 오류 \(E\)가 발생했음을 알 수 있습니다.
복구 (Recovery): 신드롬 \(s\)가 측정되면, 그에 맞는 복구 연산 \(R_s\)를 적용하여 \(R_s E |\psi\rangle_L \propto |\psi\rangle_L\) 로 되돌립니다.
3. 손쉬운 예제 (Examples with Deeper Insight)
예제 1: 3-큐빗 비트 플립 코드 (\(X\) 오류 정정)
목표: 1-큐빗 \(X\) 오류(예: \(X_1, X_2, X_3\))를 탐지하고 수정합니다.
인코딩 (Encoding): (고전적 반복과 유사하지만, 중첩이 가능)
- \(|0\rangle_L = |000\rangle\)
- \(|1\rangle_L = |111\rangle\)
- 논리 상태: \(|\psi\rangle_L = \alpha|000\rangle + \beta|111\rangle\)
신드롬 연산자 (Syndrome Operators): “이웃과 같은가?”
- \(M_1 = Z_1 Z_2\) (1-2번 큐빗의 Z-패리티)
- \(M_2 = Z_2 Z_3\) (2-3번 큐빗의 Z-패리티)
신드롬 측정 (작동 원리):
- 오류 없음 (\(I\)): \(|\psi\rangle_L\)에 \(M_1\)을 적용하면, \(Z_1 Z_2 |000\rangle = (+1)|000\rangle\) 이고 \(Z_1 Z_2 |111\rangle = (+1)|111\rangle\) 이므로, 고유값은 항상 \(+1\)입니다. \(M_2\)도 \(+1\).
- 신드롬: (+1, +1) \(\equiv\) (0, 0)
- \(X_1\) 오류 (\(X_1 \otimes I \otimes I\)):
- \(|\psi'\rangle = X_1 |\psi\rangle_L = \alpha|100\rangle + \beta|011\rangle\)
- \(M_1\) 측정: \(Z_1 Z_2 |100\rangle = (-1)|100\rangle\), \(Z_1 Z_2 |011\rangle = (-1)|011\rangle\). 고유값 \(-1\).
- \(M_2\) 측정: \(Z_2 Z_3 |100\rangle = (+1)|100\rangle\), \(Z_2 Z_3 |011\rangle = (+1)|011\rangle\). 고유값 \(+1\).
- 신드롬: (-1, +1) \(\equiv\) (1, 0)
- \(X_2\) 오류:
- \(M_1\) 측정: 고유값 \(-1\).
- \(M_2\) 측정: 고유값 \(-1\).
- 신드롬: (-1, -1) \(\equiv\) (1, 1)
- 오류 없음 (\(I\)): \(|\psi\rangle_L\)에 \(M_1\)을 적용하면, \(Z_1 Z_2 |000\rangle = (+1)|000\rangle\) 이고 \(Z_1 Z_2 |111\rangle = (+1)|111\rangle\) 이므로, 고유값은 항상 \(+1\)입니다. \(M_2\)도 \(+1\).
복구 (Recovery): | 신드롬 | 측정된 고유값 (\(M_1, M_2\)) | 탐지된 오류 | 복구 연산 | | :— | :— | :— | :— | | (0, 0) | (+1, +1) | 오류 없음 | \(I\) (아무것도 안 함) | | (1, 0) | (-1, +1) | \(X_1\) 오류 | \(X_1\) 적용 | | (1, 1) | (-1, -1) | \(X_2\) 오류 | \(X_2\) 적용 | | (0, 1) | (+1, -1) | \(X_3\) 오류 | \(X_3\) 적용 |
💡 상세 설명 (정보를 붕괴시키지 않는 이유)
신드롬 \(M_1 = Z_1 Z_2\)을 측정할 때, 우리는 \(\alpha|100\rangle + \beta|011\rangle\) 상태 전체에 대해 “고유값이 \(-1\)이다”라는 단일한 정보만 얻습니다. 이 측정은 \(|\psi'\rangle\)를 \(\alpha|100\rangle\) 또는 \(\beta|011\rangle\)로 붕괴시키지 않습니다. 왜냐하면 두 항(\(|100\rangle, |011\rangle\)) 모두가 \(M_1\)에 대해 동일한 고유값 \(-1\)을 가지므로, 측정 후에도 이 둘의 중첩 상태가 그대로 보존되기 때문입니다. 즉, \(\alpha, \beta\)에 대한 정보(우리가 지키려는 정보)는 숨겨진 채, 오류(\(X_1\))에 대한 정보만 밖으로 빼내는 데 성공한 것입니다.
예제 2: 3-큐빗 위상 플립 코드 (\(Z\) 오류 정정)
- 목표: 1-큐빗 \(Z\) 오류를 수정합니다.
- 핵심 트릭: “양자역학” 2장의 \(HXH=Z\) 관계를 이용합니다. \(Z\) 오류는 하다마드(\(H\)) 기저에서 \(X\) 오류와 같습니다.
- 인코딩 (Encoding): 비트 플립 코드의 모든 큐빗에 \(H\)를 적용합니다.
- \(|0\rangle_L = H^{\otimes 3}|000\rangle = |+++\rangle = \frac{1}{\sqrt{8}}(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)(|0\rangle+|1\rangle)\)
- \(|1\rangle_L = H^{\otimes 3}|111\rangle = |--- \rangle = \frac{1}{\sqrt{8}}(|0\rangle-|1\rangle)(|0\rangle-|1\rangle)(|0\rangle-|1\rangle)\)
- 오류 (\(Z_1\)): \(Z_1\) 오류가 발생하면 \(|\psi\rangle_L = \alpha|+++\rangle + \beta|--- \rangle\) 는 \(|\psi'\rangle = Z_1(\alpha|+++\rangle + \beta|--- \rangle) = \alpha(Z_1|{+}\rangle)|++\rangle + \beta(Z_1|{-}\rangle)|--\rangle\) \(Z_1|{+}\rangle = |{-}\rangle\) 이고 \(Z_1|{-}\rangle = |{+}\rangle\) 이므로, \(|\psi'\rangle = \alpha|-++\rangle + \beta|+-- \rangle\). (비트 플립 코드의 \(X_1\) 오류와 형태가 같음)
- 신드롬 연산자: \(X\) 오류를 잡기 위해 \(Z_i Z_j\)를 썼듯이, \(Z\) 오류를 잡기 위해 \(X_i X_j\)를 씁니다.
- \(M_1 = X_1 X_2\)
- \(M_2 = X_2 X_3\)
- 복구: \(X\) 오류와 동일한 신드롬 테이블을 사용하되, 복구 연산으로 \(X_k\) 대신 \(Z_k\)를 적용합니다.
예제 3: 9-큐빗 쇼어 코드 (모든 단일 큐빗 오류 정정)
- 목표: \(X, Z, Y\) 중 어떤 오류가 9개 큐빗 중 하나에 발생하든 모두 정정합니다.
- 인코딩 (두 코드의 결합):
- 위상 보호 (외부 코드): 먼저 1큐빗을 3큐빗 위상 플립 코드로 인코딩합니다. \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle \to |\psi_{step1}\rangle = \alpha|+++\rangle + \beta|--- \rangle\)
- 비트 보호 (내부 코드): 위 3개의 큐빗 각각을 다시 3-큐빗 비트 플립 코드로 인코딩합니다. (총 \(3 \times 3 = 9\) 큐빗) \(|+\rangle \to |+\rangle_L = \frac{1}{\sqrt{2}}(|000\rangle + |111\rangle)\) \(|-\rangle \to |-\rangle_L = \frac{1}{\sqrt{2}}(|000\rangle - |111\rangle)\)
- 최종 상태 (매우 복잡한 9큐빗 얽힘 상태): \(|0\rangle_L = \frac{1}{\sqrt{8}}(|000\rangle+|111\rangle)(|000\rangle+|111\rangle)(|000\rangle+|111\rangle)\) \(|1\rangle_L = \frac{1}{\sqrt{8}}(|000\rangle-|111\rangle)(|000\rangle-|111\rangle)(|000\rangle-|111\rangle)\)
- 신드롬 측정:
- 3개의 큐빗으로 이루어진 각 블록(1-3, 4-6, 7-9) 내부에서 \(Z_i Z_{i+1}\) 타입의 비트 플립 신드롬을 측정합니다. (총 6개의 측정)
- 3개의 블록 간에 \(X_i X_j\) 타입의 위상 플립 신드롬을 측정합니다. (총 2개의 측정)
- 총 8개의 신드롬 측정으로 9개 큐빗 중 어디에 \(X\) 또는 \(Z\) 오류가 났는지 정확히 식별할 수 있습니다.
- 💡 상세 설명 (Y 오류는 어떻게?): > “양자역사” 6장에서 \(Y = iXZ\) 임을 배웠습니다. 만약 \(Y_1\) 오류가 발생하면, 이는 \(X_1\) 오류와 \(Z_1\) 오류가 동시에 1번 큐빗에 발생한 것과 같습니다. > 쇼어 코드는 비트 플립 신드롬을 통해 \(X_1\) 오류를 감지하고, 위상 플립 신드롬을 통해 \(Z_1\) 오류를 감지합니다. 두 신드롬이 모두 1번 큐빗을 가리키면, 우리는 복구 연산으로 \(Y_1 = iXZ\) (또는 그냥 \(XZ\))를 적용하여 두 오류를 동시에 수정합니다. (전역 위상 \(i\)는 무시 가능) > 이로써 우리는 모든 단일 큐빗 오류를 정정할 수 있습니다.
4. 연습문제
- 신드롬 계산: 3-큐빗 비트 플립 코드에서 3번 큐빗에 \(X_3\) 오류가 발생했을 때, \(M_1 = Z_1 Z_2\)와 \(M_2 = Z_2 Z_3\)의 고유값이 어떻게 나오는지 계산하십시오.
- 회로 그리기: 3-큐빗 비트 플립 코드에서 \(M_1 = Z_1 Z_2\)의 신드롬을 측정하는 양자 회로를 2개의 CNOT 게이트와 1개의 보조 큐빗(ancilla)을 이용해 그리십시오. (힌트: 보조 큐빗을 제어로 사용)
- 오류 교차: 3-큐빗 비트 플립 코드(\(|000\rangle, |111\rangle\))가 \(X\) 오류 대신 \(Z_1\) 위상 플립 오류를 겪었다고 가정합니다. 신드롬 연산자(\(M_1, M_2\))가 이 오류를 탐지할 수 있습니까? 그 이유는 무엇입니까?
- 쇼어 코드 용량: 9-큐빗 쇼어 코드는 \(n=9\)개의 물리 큐빗을 사용하여 \(k=1\)개의 논리 큐빗을 보호합니다. 이 코드가 \(t=1\)개의 단일 큐빗 오류를 수정할 수 있을 때, 이 \((n, k, d)\) 파라미터(단, \(d=2t+1\))는 무엇이라고 부릅니까? (상식 문제)
5. 해설
- \(|\psi'\rangle = X_3 |\psi\rangle_L = \alpha|001\rangle + \beta|110\rangle\).
- \(M_1 = Z_1 Z_2\): \(Z_1 Z_2 |001\rangle = (+1)|001\rangle\), \(Z_1 Z_2 |110\rangle = (+1)|110\rangle\). 고유값 +1.
- \(M_2 = Z_2 Z_3\): \(Z_2 Z_3 |001\rangle = (-1)|001\rangle\), \(Z_2 Z_3 |110\rangle = (-1)|110\rangle\). 고유값 -1.
- 신드롬: (+1, -1) \(\equiv\) (0, 1). (예제 1의 표와 일치)
- 보조 큐빗(ancilla)을 \(|0\rangle_a\)로 준비하고 H 게이트를 적용 \(\to |+\rangle_a\). \(|0\rangle_a \to [H] \to \bullet (\text{제어}) \to \bullet (\text{제어}) \to [H] \to \text{측정}\) \(\quad \quad \quad \quad \quad | \quad \quad \quad \quad |\) \(|q_1\rangle \to \quad \quad \oplus (\text{대상}) \quad \quad\) \(|q_2\rangle \to \quad \quad \quad \quad \quad \oplus (\text{대상})\) (수정) \(Z\) 연산자를 측정하는 것은 CNOT의 방향이 반대입니다. \(|0\rangle_a \to [H] \to \text{CNOT(제어:q1, 대상:a)} \to \text{CNOT(제어:q2, 대상:a)} \to [H] \to \text{측정}\) (재수정) \(Z_1 Z_2\) 측정은 더 간단합니다. \(|0\rangle_a \to \text{CNOT(제어:q1, 대상:a)} \to \text{CNOT(제어:q2, 대상:a)} \to \text{측정}\) (H 게이트 없음) 보조 큐빗을 \(|0\rangle\)으로 준비. CNOT(1->a) \(\to\) CNOT(2->a) \(\to\) 보조 큐빗 측정. 측정 결과가 ’1’이면 고유값 -1, ’0’이면 +1을 의미합니다.
- \(|\psi'\rangle = Z_1 |\psi\rangle_L = Z_1(\alpha|000\rangle + \beta|111\rangle) = \alpha|000\rangle - \beta|111\rangle\).
- \(M_1 = Z_1 Z_2\): \(Z_1 Z_2(\alpha|000\rangle - \beta|111\rangle) = \alpha(+1)|000\rangle - \beta(+1)|111\rangle = +1 |\psi'\rangle\).
- \(M_2 = Z_2 Z_3\): \(Z_2 Z_3(\alpha|000\rangle - \beta|111\rangle) = \alpha(+1)|000\rangle - \beta(+1)|111\rangle = +1 |\psi'\rangle\).
- 신드롬은 (0, 0)입니다. \(Z\) 오류는 탐지되지 않습니다. 비트 플립 코드는 \(X\) 오류에만 특화되어 있으며, \(Z\) 오류에는 완전히 무방비합니다.
- \(n=9\) (물리 큐빗 수), \(k=1\) (논리 큐빗 수), \(t=1\) (수정 가능 오류 수). 오류 코드의 ‘거리(distance)’ \(d\)는 \(d=2t+1\)로 정의됩니다. \(t=1\)이므로 \(d=3\)입니다. 이를 \([[n, k, d]]\) 코드로 표기하며, 쇼어 코드는 [[9, 1, 3]] 코드입니다.